package com.ctshk.rpc.booking.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ctshk.common.enums.IsDeletedCode;
import com.ctshk.common.utils.EntityUtil;
import com.ctshk.common.utils.SnowflakeIdWorker;
import com.ctshk.rpc.booking.dto.system.hotel.info.SupplierSystemOrderHotelCheckInInfoDTO;
import com.ctshk.rpc.booking.dto.system.hotel.info.SupplierSystemOrderHotelTouristInfoDTO;
import com.ctshk.rpc.booking.entity.SupplierSystemOrderHotelCheckIn;
import com.ctshk.rpc.booking.entity.SupplierSystemOrderHotelTourist;
import com.ctshk.rpc.booking.mapper.SupplierSystemOrderHotelCheckInMapper;
import com.ctshk.rpc.booking.mapper.SupplierSystemOrderHotelTouristMapper;
import com.ctshk.rpc.booking.req.system.hotel.add.SupplierSystemOrderHotelCheckInAddReq;
import com.ctshk.rpc.booking.req.system.hotel.add.SupplierSystemOrderHotelTouristAddReq;
import com.ctshk.rpc.booking.req.system.hotel.edit.SupplierSystemOrderHotelCheckInEditReq;
import com.ctshk.rpc.booking.service.ISupplierSystemOrderHotelCheckInService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.management.Query;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 系统酒店入住信息 服务实现类
 * </p>
 *
 * @author 谢诗宏
 * @since 2021-03-09
 */
@DubboService
public class SupplierSystemOrderHotelCheckInServiceImpl implements ISupplierSystemOrderHotelCheckInService {
    @Autowired
    SupplierSystemOrderHotelCheckInMapper supplierSystemOrderHotelCheckInMapper;
    @Autowired
    SupplierSystemOrderHotelTouristMapper supplierSystemOrderHotelTouristMapper;

    @Override
    public void update(List<SupplierSystemOrderHotelCheckInEditReq> supplierSystemOrderHotelCheckInEditReqList) {
        if (CollectionUtils.isNotEmpty(supplierSystemOrderHotelCheckInEditReqList)) {
            supplierSystemOrderHotelCheckInEditReqList.forEach(hotelEditReq -> {
                UpdateWrapper<SupplierSystemOrderHotelCheckIn> updateWrapper = new UpdateWrapper<>();
                updateWrapper.lambda().eq(SupplierSystemOrderHotelCheckIn::getId, hotelEditReq.getId());
                updateWrapper.lambda().set(SupplierSystemOrderHotelCheckIn::getExtraService, hotelEditReq.getExtraService());
                updateWrapper.lambda().set(SupplierSystemOrderHotelCheckIn::getCustomerRemark, hotelEditReq.getCustomerRemark());
                updateWrapper.lambda().set(SupplierSystemOrderHotelCheckIn::getSupplierRemark, hotelEditReq.getSupplierRemark());
                supplierSystemOrderHotelCheckInMapper.update(new SupplierSystemOrderHotelCheckIn(), updateWrapper);
            });
        }
    }

    @Override
    public void add(Long id, Long userId, LocalDateTime nowDateTime, List<SupplierSystemOrderHotelCheckInAddReq> supplierSystemOrderHotelCheckInAddReqList) {
        if (CollectionUtils.isNotEmpty(supplierSystemOrderHotelCheckInAddReqList)) {
            supplierSystemOrderHotelCheckInAddReqList.forEach(hotelAddReq -> {
                SupplierSystemOrderHotelCheckIn supplierSystemOrderHotelCheckIn = EntityUtil.copy(hotelAddReq, SupplierSystemOrderHotelCheckIn.class);
                supplierSystemOrderHotelCheckIn.setId(SnowflakeIdWorker.nextId());
                supplierSystemOrderHotelCheckIn.setOrderId(id);
                supplierSystemOrderHotelCheckInMapper.insert(supplierSystemOrderHotelCheckIn);
                //添加旅客
                List<SupplierSystemOrderHotelTouristAddReq> supplierSystemOrderHotelTouristAddReqList = hotelAddReq.getSupplierSystemOrderHotelTouristAddReqList();
                if (CollectionUtils.isNotEmpty(supplierSystemOrderHotelTouristAddReqList)) {
                    supplierSystemOrderHotelTouristAddReqList.forEach(hotelTouristAdd -> {
                        SupplierSystemOrderHotelTourist supplierSystemOrderHotelTourist = EntityUtil.copy(hotelTouristAdd, SupplierSystemOrderHotelTourist.class);
                        supplierSystemOrderHotelTourist.setId(SnowflakeIdWorker.nextId());
                        supplierSystemOrderHotelTourist.setOrderId(id);
                        supplierSystemOrderHotelTourist.setCheckInId(supplierSystemOrderHotelCheckIn.getId());
                        supplierSystemOrderHotelTourist.setCreateId(userId);
                        supplierSystemOrderHotelTourist.setGmtCreate(nowDateTime);
                        supplierSystemOrderHotelTourist.setModifiedId(userId);
                        supplierSystemOrderHotelTourist.setGmtModified(nowDateTime);
                        supplierSystemOrderHotelTourist.setIsDeleted(IsDeletedCode.NO.getCode());
                        supplierSystemOrderHotelTouristMapper.insert(supplierSystemOrderHotelTourist);
                    });
                }
            });
        }
    }

    @Override
    public List<SupplierSystemOrderHotelCheckInInfoDTO> selectByOrderId(Long id) {
        QueryWrapper<SupplierSystemOrderHotelCheckIn> hotelQueryWrapper = new QueryWrapper<>();
        hotelQueryWrapper.lambda().eq(SupplierSystemOrderHotelCheckIn::getOrderId, id);
        List<SupplierSystemOrderHotelCheckIn> supplierSystemOrderHotelCheckInList = supplierSystemOrderHotelCheckInMapper.selectList(hotelQueryWrapper);
        List<SupplierSystemOrderHotelCheckInInfoDTO> supplierSystemOrderHotelCheckInInfoDTOList = EntityUtil.copyList(supplierSystemOrderHotelCheckInList, SupplierSystemOrderHotelCheckInInfoDTO.class);
        if (CollectionUtils.isNotEmpty(supplierSystemOrderHotelCheckInInfoDTOList)) {
            supplierSystemOrderHotelCheckInInfoDTOList.forEach(hotelCheckinDTO -> {
                //添加旅客
                QueryWrapper<SupplierSystemOrderHotelTourist> hotelTouristQueryWrapper = new QueryWrapper<>();
                hotelTouristQueryWrapper.lambda().eq(SupplierSystemOrderHotelTourist::getOrderId, id);
                hotelTouristQueryWrapper.lambda().eq(SupplierSystemOrderHotelTourist::getCheckInId, hotelCheckinDTO.getId());
                List<SupplierSystemOrderHotelTourist> supplierSystemOrderHotelTourists = supplierSystemOrderHotelTouristMapper.selectList(hotelTouristQueryWrapper);
                List<SupplierSystemOrderHotelTouristInfoDTO> supplierSystemOrderHotelTouristInfoDTOS = EntityUtil.copyList(supplierSystemOrderHotelTourists, SupplierSystemOrderHotelTouristInfoDTO.class);
                hotelCheckinDTO.setSupplierSystemOrderHotelTouristInfoDTOList(supplierSystemOrderHotelTouristInfoDTOS);
            });
        }
        return supplierSystemOrderHotelCheckInInfoDTOList;
    }
}
